package org.madmac.join;

import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

import org.madmac.exception.PXMNotFoundException;
import org.wakeful.conn.Connection;

/**
 * @deprecated
 * @author atila
 * DONE: mudar classe para PlacaRede com obj Maquina dentro.
 */
public class PlacaRedeXMaquinas extends org.madmac.placaRede.PlacaRede {

   private int code_setor;
   private String setor;
   private String responsavel;
   private int tombamento;
   private String sistema_op;
   private String modelo;
   private String faixa;
   private static PlacaRedeXMaquinas instance;

   private PlacaRedeXMaquinas() {
      super();
   }

   public static PlacaRedeXMaquinas getInstance() {

      if (instance == null) {
         instance = new PlacaRedeXMaquinas();
      }
      return instance;
   }

   public int getCode_setor() {
      return code_setor;
   }

   public void setCode_setor(int code_setor) {
      this.code_setor = code_setor;
   }

   public String getSetor() {
      return setor;
   }

   public void setSetor(String setor) {
      this.setor = setor;
   }

   public String getResponsavel() {
      return responsavel;
   }

   public void setResponsavel(String responsavel) {
      this.responsavel = responsavel;
   }

   public int getTombamento() {
      return tombamento;
   }

   public void setTombamento(int tombamento) {
      this.tombamento = tombamento;
   }

   public String getSistema_op() {
      return sistema_op;
   }

   public void setSistema_op(String sistema_op) {
      this.sistema_op = sistema_op;
   }

   public String getModelo() {
      return modelo;
   }

   public void setModelo(String modelo) {
      this.modelo = modelo;
   }

   public String getFaixa() {
      return faixa;
   }

   public void setFaixa(String faixa) {
      this.faixa = faixa;
   }

   /**
    *
    * @param search_mac
    * @return
    * @throws SQLException
    * @throws ClassNotFoundException
    * DONE: mudar o metodo para a classe PlacaRedeDao.
    */
   public PlacaRedeXMaquinas selectMacDetails(String search_mac) throws SQLException, ClassNotFoundException, Exception {

      PlacaRedeXMaquinas pxm = null;

      java.sql.Connection conn = Connection.getInstance();

      StringBuilder builder = new StringBuilder();
      builder.append("SELECT pr.mac, pr.acesso_sem_fio, pr.ip, s.nome AS setor, p.nome AS responsavel, ");
      builder.append("m.sistema_op, tombamento, f.descricao AS faixa, f.id_faixa_ip ");
      builder.append("FROM madmac.placa_rede pr ");
      builder.append("INNER JOIN madmac.maquina m ");
      builder.append("ON pr.id_maquina = m.id_maquina ");
      builder.append("LEFT JOIN madmac.setor s ");
      builder.append("ON m.id_setor = s.id_setor ");
      builder.append("LEFT JOIN madmac.ip ip ");
      builder.append("ON ip.ip = pr.ip ");
      builder.append("INNER JOIN madmac.faixa_ip f ");
      builder.append("ON ip.id_faixa_ip = f.id_faixa_ip ");
      builder.append("LEFT JOIN madmac.pessoa p ");
      builder.append("ON p.id_pessoa = m.id_pessoa ");
      builder.append("WHERE pr.mac = ?");
      String sql = builder.toString();
      /*"SELECT mp.mac, mp.acesso_sem_fio, mp.ip, us.nome AS setor, up.nome AS responsavel, ";
      sql += "mm.sistema_op, mm.tombamento, mf.descricao AS faixa, mf.id_faixa_ip ";
      sql += "FROM madmac.placa_rede mp, madmac.maquinas mm, unify.setores us, ";
      sql += "madmac.ip mi, madmac.faixa_ip mf, unify.pessoas up ";
      sql += "WHERE mp.id_maquina = mm.id_maquina ";
      sql += "AND mm.code_setor = us.code_setor ";
      sql += "AND mp.ip = mi.ip ";
      sql += "AND mi.id_faixa_ip = mf.id_faixa_ip ";
      sql += "AND mm.code_pessoa = up.code_pessoa ";
      sql += "AND mp.mac = '" + search_mac + "' ";*/
      PreparedStatement pstmt = conn.prepareStatement(sql);

      ResultSet rs = null;
      try {
         rs = pstmt.executeQuery(sql);

         if (rs.next()) {

            pxm = new PlacaRedeXMaquinas();

            pxm.setMac(rs.getString("mac"));
            pxm.setTombamento(rs.getInt("tombamento"));
            //pxm.setIp(rs.getString("ip"));
            pxm.setRedeSemFio(rs.getBoolean("acesso_sem_fio"));
            pxm.setSetor(rs.getString("setor"));
            pxm.setResponsavel(rs.getString("responsavel"));
            pxm.setSistema_op(rs.getString("sistema_op"));
            pxm.setFaixaIp(rs.getInt("id_faixa_ip"));
            pxm.setFaixa(rs.getString("faixa"));

         } else {
            throw new PXMNotFoundException("Endereço MAC não encontrado.");
         }
      } catch (Exception e) {
         throw new Exception(e);
      } finally {
         pstmt.close();
         if (rs != null) {
            rs.close();
         }
      }
      return pxm;
   }

   /**
    * FIXME: ESTÁ SENDO USADO SOMENTE NO METODO searchByHalfOfMAC. MAS PRECISA SER CONSERTADO!!!
    * @return List<PlacaRedeXMaquinas>
    * @throws SQLException
    * @throws ClassNotFoundException
    */
   public List<PlacaRedeXMaquinas> selectAllMAC() throws SQLException, ClassNotFoundException, Exception {

      List<PlacaRedeXMaquinas> lista = new ArrayList<PlacaRedeXMaquinas>();

      java.sql.Connection conn = Connection.getInstance();
      Statement stmt = conn.createStatement();

      String sql = "SELECT mp.mac, mp.acesso_sem_fio, mp.ip, us.nome AS setor, up.nome AS responsavel, ";
      sql += "mm.sistema_op, mm.tombamento, mf.descricao AS faixa, mf.id_faixa_ip ";
      sql += "FROM madmac.placa_rede mp, madmac.maquinas mm, unify.setores us, ";
      sql += "madmac.ip mi, madmac.faixa_ip mf, unify.pessoas up ";
      sql += "WHERE mp.id_maquina = mm.id_maquina ";
      sql += "AND mm.code_setor = us.code_setor ";
      sql += "AND mp.ip = mi.ip ";
      sql += "AND mi.id_faixa_ip = mf.id_faixa_ip ";
      sql += "AND mm.code_pessoa = up.code_pessoa ";
      sql += "ORDER BY mm.tombamento ";

      ResultSet rs = null;
      try {
         rs = stmt.executeQuery(sql);
      } catch (Exception e) {
         return null;
      }

      while (rs.next()) {

         PlacaRedeXMaquinas pxm = new PlacaRedeXMaquinas();

         pxm.setMac(rs.getString("mac"));
         pxm.setId_maquina(rs.getInt("id_maquina"));
         pxm.setTombamento(rs.getInt("tombamento"));
         //pxm.setIp(rs.getString("ip"));
         pxm.setRede_sem_fio(rs.getBoolean("acesso_sem_fio"));
         pxm.setSetor(rs.getString("setor"));
         pxm.setResponsavel(rs.getString("responsavel"));
         pxm.setSistema_op(rs.getString("sistema_op"));
         pxm.setFaixa(rs.getString("faixa"));

         lista.add(pxm);
      }

      return lista;
   }

   public List<PlacaRedeXMaquinas> selectAllYouWant(int search_code_setor, int search_faixa_ip) throws SQLException, ClassNotFoundException, Exception {

      List<PlacaRedeXMaquinas> lista = new ArrayList<PlacaRedeXMaquinas>();

      java.sql.Connection conn = Connection.getInstance();
      Statement stmt = conn.createStatement();

      String sql = "SELECT mp.mac, mp.acesso_sem_fio, mp.ip, us.nome AS setor, up.nome AS responsavel, ";
      sql += "mm.sistema_op, mm.tombamento, mf.descricao AS faixa, mf.id_faixa_ip ";
      sql += "FROM madmac.placa_rede mp, madmac.maquinas mm, unify.setores us, ";
      sql += "madmac.ip mi, madmac.faixa_ip mf, unify.pessoas up ";
      sql += "WHERE mp.id_maquina = mm.id_maquina ";
      sql += "AND mm.code_setor = us.code_setor ";
      sql += "AND mp.ip = mi.ip ";
      sql += "AND mi.id_faixa_ip = mf.id_faixa_ip ";
      sql += "AND mm.code_pessoa = up.code_pessoa ";

      if (search_code_setor > 0) {

         sql += "AND us.code_setor = " + search_code_setor + " ";
      }

      if (search_faixa_ip > 0) {

         sql += "AND mf.id_faixa_ip = " + search_faixa_ip + " ";
      }

      sql += "ORDER BY mm.tombamento ";

      ResultSet rs = null;
      try {
         rs = stmt.executeQuery(sql);
      } catch (Exception e) {
         return null;
      }

      while (rs.next()) {

         PlacaRedeXMaquinas pxm = new PlacaRedeXMaquinas();

         pxm.setMac(rs.getString("mac"));
         pxm.setTombamento(rs.getInt("tombamento"));
         //pxm.setIp(rs.getString("ip"));
         pxm.setRede_sem_fio(rs.getBoolean("acesso_sem_fio"));
         pxm.setSetor(rs.getString("setor"));
         pxm.setResponsavel(rs.getString("responsavel"));
         pxm.setSistema_op(rs.getString("sistema_op"));
         pxm.setFaixa(rs.getString("faixa"));

         lista.add(pxm);
      }

      return lista;
   }

   public List<PlacaRedeXMaquinas> searchByHalfOfMAC(String halfMAC, int search_id_sala, int search_faixa_ip) throws SQLException, ClassNotFoundException, Exception {

      List<PlacaRedeXMaquinas> mainLista = new ArrayList<PlacaRedeXMaquinas>(); // recebe os MAC's encontrados
      List<PlacaRedeXMaquinas> aux = null; // recebe elementos da busca no banco

      if (search_id_sala > 0 || search_faixa_ip > 0) { // busca apenas em uma sala ou faixa ip

         try {

            aux = PlacaRedeXMaquinas.getInstance().selectAllYouWant(search_id_sala, search_faixa_ip);
         } catch (Exception e) {
            throw new PXMNotFoundException("Erro ao buscar endereços MAC por Setor/Faixa IP.");
         }

      } else { // busca em todos os endereços MAC

         aux = PlacaRedeXMaquinas.getInstance().selectAllMAC();
      }

      for (int i = 0; i < aux.size(); i++) { // varre o array em busca de parte do MAC

         PlacaRedeXMaquinas currentMAC = aux.get(i);

         if (currentMAC.getMac().contains(halfMAC)) { // SE O MAC CONTEM A PARTE DO ENDEREÇO EM QUESTÃO, ADICIONA À LISTA.
            mainLista.add(currentMAC);
         }
      }

      return mainLista;
   }

   public PlacaRedeXMaquinas selectIpDetails(String search_ip) throws SQLException, ClassNotFoundException, Exception {

      PlacaRedeXMaquinas resultIp = null;

      java.sql.Connection conn = Connection.getInstance();
      Statement stmt = conn.createStatement();

      String sql = "SELECT mp.mac, mp.acesso_sem_fio, mp.ip, us.code_setor, us.nome AS setor, up.nome AS responsavel, ";
      sql += "mm.sistema_op, mm.tombamento, mf.descricao AS faixa, mf.id_faixa_ip ";
      sql += "FROM madmac.placa_rede mp, madmac.maquinas mm, unify.setores us, ";
      sql += "madmac.ip mi, madmac.faixa_ip mf, unify.pessoas up ";
      sql += "WHERE mp.id_maquina = mm.id_maquina ";
      sql += "AND mm.code_setor = us.code_setor ";
      sql += "AND mp.ip = mi.ip ";
      sql += "AND mi.id_faixa_ip = mf.id_faixa_ip ";
      sql += "AND mm.code_pessoa = up.code_pessoa ";
      sql += "AND mi.ip = '" + search_ip + "' ";

      ResultSet rs = null;
      try {
         rs = stmt.executeQuery(sql);
      } catch (Exception e) {
         return null;
      }

      if (rs.next()) {

         resultIp = new PlacaRedeXMaquinas();

         resultIp.setMac(rs.getString("mac"));
         resultIp.setTombamento(rs.getInt("tombamento"));
         //resultIp.setIp(rs.getString("ip"));
         resultIp.setRede_sem_fio(rs.getBoolean("acesso_sem_fio"));
         resultIp.setCode_setor(rs.getInt("code_setor"));
         resultIp.setSetor(rs.getString("setor"));
         resultIp.setResponsavel(rs.getString("responsavel"));
         resultIp.setSistema_op(rs.getString("sistema_op"));
         resultIp.setFaixa_ip(rs.getInt("id_faixa_ip"));
         resultIp.setFaixa(rs.getString("faixa"));

      }

      return resultIp;
   }
}
